home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 8
/
FM Towns Free Software Collection 8.iso
/
t_os
/
catlog
/
all_s
< prev
next >
Wrap
Text File
|
1994-06-01
|
29KB
|
1,467 lines
/* DIVIDE_START=cons.s */
/**************************************************************
;
; コンンソ-ル割り込み設定ル-チン
;
; 1991.01.01 Make by Ken
;
;**************************************************************/
/**************************************************************
; 各種値の設定
;**************************************************************/
#define CONBIOS $0x29 /* 割り込むベクタ番号 */
#define STACK_SIZE (10*1024) /* ロ-カルスタックサイズ */
/**************************************************************
; 外部参照関数の定義
;**************************************************************
extrn CON_bios:near ; メインのコンソ-ル関数
*/
.lcomm nt_vet_off,4
.lcomm nt_vet_seg,2
.lcomm rl_vet_ral,4
.lcomm save_esp,4
.lcomm save_ss,2
.lcomm stack_flg,2
.lcomm new_esp,4
.lcomm new_ss,2
consol_path: .asciz "CON"
null_path: .asciz "NUL"
break_flg: .byte 0
.align 2
.lcomm local_stack,STACK_SIZE
.lcomm local_stack_btm,2
/***************************************************
;
; 割り込み処理ル-チン
;
;***************************************************/
CON_bios_entry:
cmpw $0,stack_flg
jne go_ret
incw stack_flg
movl %esp,save_esp
movw %ss,save_ss
lss new_esp,%esp
pushal
sti
cld
push %ds
pop %es
movl %esp,%ebp
push %ebp
call _CON_bios
addl $4,%esp
popal
lss save_esp,%esp
decw stack_flg
go_ret: iretl
/**************************************************************
;
; ファイルのリダイレクト処理
;
; al = ファイルのオ-プンモ-ド
; bx = ファイルパス番号
; edx = NEWデバイスネ-ム
;
;**************************************************************/
reopen:
push %ax
movb $0x3e,%ah
int $0x21
pop %ax
movb $0x3d,%ah
int $0x21
reo_ret:ret
/**************************************************************
;
; コンソ-ル割り込みの設定及び標準入出力の設定
;
;
;void CON_bios_set(void)
;
;**************************************************************/
.globl _CON_bios_set
_CON_bios_set:
push %ds
push %es
push %ebx
push %edx
movw %ds,new_ss
leal local_stack_btm,%ebx
movl %ebx,new_esp
movw $0x2502,%ax
movb CONBIOS,%cl
int $0x21
movw %es,nt_vet_seg
movl %ebx,nt_vet_off
movw $0x2503,%ax
movb CONBIOS,%cl
int $0x21
movl %ebx,rl_vet_ral
movw $0x2506,%ax
movb CONBIOS,%cl
push %ds
movw %cs,%dx
movw %dx,%ds
leal CON_bios_entry,%edx
int $0x21
pop %ds
movb $0,%al
movw $0,%bx
leal consol_path,%edx
call reopen
movb $1,%al
movw $1,%bx
call reopen
movb $1,%al
movw $2,%bx
call reopen
movw $0x3300,%ax
int $0x21
movb %dl,break_flg
movw $0x3301,%ax
movb $0,%dl
int $0x21
pop %edx
pop %ebx
pop %es
pop %ds
ret
/**************************************************************
;
; コンソ-ル割り込みを元に戻し標準入出力をNULにする
;
;void CON_bios_ret(void)
;
;**************************************************************/
.globl _CON_bios_ret
_CON_bios_ret:
push %ds
push %ebx
push %edx
movb CONBIOS,%cl
movl rl_vet_ral,%ebx
movl nt_vet_off,%edx
movw nt_vet_seg,%ax
push %ds
movw %ax,%ds
movw $0x2507,%ax
int $0x21
pop %ds
movb $0,%al
movw $0,%bx
leal null_path,%edx
call reopen
movb $1,%al
movw $1,%bx
call reopen
movb $1,%al
movw $2,%bx
call reopen
movw $0x3301,%ax
movb break_flg,%dl
int $0x21
pop %edx
pop %ebx
pop %ds
ret
/**************************************************************
; アセンブラル-チンの終了
;**************************************************************/
/* DIVIDE_END */
/* DIVIDE_START=dspstr.s */
/***************************************************************
;
; 16色VRAM文字表示下位ル-チン
;
; 1991.01.01 Make by Ken
;
;***************************************************************/
/**************************************************************
; セレクタ値の定義
;**************************************************************/
#define VRAMSEL $0x104
#define TBIOSEL $0x110
#define FONTSEL $0x138
/**************************************************************
; SJIS漢字コ-ドテ-ブルのマスク値定義
;**************************************************************/
#define ISKAN1 1
#define ISKAN2 2
/**************************************************************
; ANK文字のVRAMイメ-ジパタ-ンエリア
;**************************************************************/
.data
.align 2
.lcomm ankfnt,16*256*4
/**************************************************************
; カラ-コ-ドを含むVRAMイメ-ジテ-ブル
;**************************************************************/
.lcomm fntcol,256*4
/**************************************************************
; カラ-コ-ドの4ビット1ピクセルテ-ブル
;**************************************************************/
colptn:
.long 0x00000000,0x11111111,0x22222222,0x33333333
.long 0x44444444,0x55555555,0x66666666,0x77777777
.long 0x88888888,0x99999999,0xaaaaaaaa,0xbbbbbbbb
.long 0xcccccccc,0xdddddddd,0xeeeeeeee,0xffffffff
/**************************************************************
; 16色VRAMビットイメ-ジテ-ブル
; 1ビット8ピクセル→4ビット8ピクセルへ変換
;**************************************************************/
fntptn:
.long 0x00000000,0xf0000000,0x0f000000,0xff000000
.long 0x00f00000,0xf0f00000,0x0ff00000,0xfff00000
.long 0x000f0000,0xf00f0000,0x0f0f0000,0xff0f0000
.long 0x00ff0000,0xf0ff0000,0x0fff0000,0xffff0000
.long 0x0000f000,0xf000f000,0x0f00f000,0xff00f000
.long 0x00f0f000,0xf0f0f000,0x0ff0f000,0xfff0f000
.long 0x000ff000,0xf00ff000,0x0f0ff000,0xff0ff000
.long 0x00fff000,0xf0fff000,0x0ffff000,0xfffff000
.long 0x00000f00,0xf0000f00,0x0f000f00,0xff000f00
.long 0x00f00f00,0xf0f00f00,0x0ff00f00,0xfff00f00
.long 0x000f0f00,0xf00f0f00,0x0f0f0f00,0xff0f0f00
.long 0x00ff0f00,0xf0ff0f00,0x0fff0f00,0xffff0f00
.long 0x0000ff00,0xf000ff00,0x0f00ff00,0xff00ff00
.long 0x00f0ff00,0xf0f0ff00,0x0ff0ff00,0xfff0ff00
.long 0x000fff00,0xf00fff00,0x0f0fff00,0xff0fff00
.long 0x00ffff00,0xf0ffff00,0x0fffff00,0xffffff00
.long 0x000000f0,0xf00000f0,0x0f0000f0,0xff0000f0
.long 0x00f000f0,0xf0f000f0,0x0ff000f0,0xfff000f0
.long 0x000f00f0,0xf00f00f0,0x0f0f00f0,0xff0f00f0
.long 0x00ff00f0,0xf0ff00f0,0x0fff00f0,0xffff00f0
.long 0x0000f0f0,0xf000f0f0,0x0f00f0f0,0xff00f0f0
.long 0x00f0f0f0,0xf0f0f0f0,0x0ff0f0f0,0xfff0f0f0
.long 0x000ff0f0,0xf00ff0f0,0x0f0ff0f0,0xff0ff0f0
.long 0x00fff0f0,0xf0fff0f0,0x0ffff0f0,0xfffff0f0
.long 0x00000ff0,0xf0000ff0,0x0f000ff0,0xff000ff0
.long 0x00f00ff0,0xf0f00ff0,0x0ff00ff0,0xfff00ff0
.long 0x000f0ff0,0xf00f0ff0,0x0f0f0ff0,0xff0f0ff0
.long 0x00ff0ff0,0xf0ff0ff0,0x0fff0ff0,0xffff0ff0
.long 0x0000fff0,0xf000fff0,0x0f00fff0,0xff00fff0
.long 0x00f0fff0,0xf0f0fff0,0x0ff0fff0,0xfff0fff0
.long 0x000ffff0,0xf00ffff0,0x0f0ffff0,0xff0ffff0
.long 0x00fffff0,0xf0fffff0,0x0ffffff0,0xfffffff0
.long 0x0000000f,0xf000000f,0x0f00000f,0xff00000f
.long 0x00f0000f,0xf0f0000f,0x0ff0000f,0xfff0000f
.long 0x000f000f,0xf00f000f,0x0f0f000f,0xff0f000f
.long 0x00ff000f,0xf0ff000f,0x0fff000f,0xffff000f
.long 0x0000f00f,0xf000f00f,0x0f00f00f,0xff00f00f
.long 0x00f0f00f,0xf0f0f00f,0x0ff0f00f,0xfff0f00f
.long 0x000ff00f,0xf00ff00f,0x0f0ff00f,0xff0ff00f
.long 0x00fff00f,0xf0fff00f,0x0ffff00f,0xfffff00f
.long 0x00000f0f,0xf0000f0f,0x0f000f0f,0xff000f0f
.long 0x00f00f0f,0xf0f00f0f,0x0ff00f0f,0xfff00f0f
.long 0x000f0f0f,0xf00f0f0f,0x0f0f0f0f,0xff0f0f0f
.long 0x00ff0f0f,0xf0ff0f0f,0x0fff0f0f,0xffff0f0f
.long 0x0000ff0f,0xf000ff0f,0x0f00ff0f,0xff00ff0f
.long 0x00f0ff0f,0xf0f0ff0f,0x0ff0ff0f,0xfff0ff0f
.long 0x000fff0f,0xf00fff0f,0x0f0fff0f,0xff0fff0f
.long 0x00ffff0f,0xf0ffff0f,0x0fffff0f,0xffffff0f
.long 0x000000ff,0xf00000ff,0x0f0000ff,0xff0000ff
.long 0x00f000ff,0xf0f000ff,0x0ff000ff,0xfff000ff
.long 0x000f00ff,0xf00f00ff,0x0f0f00ff,0xff0f00ff
.long 0x00ff00ff,0xf0ff00ff,0x0fff00ff,0xffff00ff
.long 0x0000f0ff,0xf000f0ff,0x0f00f0ff,0xff00f0ff
.long 0x00f0f0ff,0xf0f0f0ff,0x0ff0f0ff,0xfff0f0ff
.long 0x000ff0ff,0xf00ff0ff,0x0f0ff0ff,0xff0ff0ff
.long 0x00fff0ff,0xf0fff0ff,0x0ffff0ff,0xfffff0ff
.long 0x00000fff,0xf0000fff,0x0f000fff,0xff000fff
.long 0x00f00fff,0xf0f00fff,0x0ff00fff,0xfff00fff
.long 0x000f0fff,0xf00f0fff,0x0f0f0fff,0xff0f0fff
.long 0x00ff0fff,0xf0ff0fff,0x0fff0fff,0xffff0fff
.long 0x0000ffff,0xf000ffff,0x0f00ffff,0xff00ffff
.long 0x00f0ffff,0xf0f0ffff,0x0ff0ffff,0xfff0ffff
.long 0x000fffff,0xf00fffff,0x0f0fffff,0xff0fffff
.long 0x00ffffff,0xf0ffffff,0x0fffffff,0xffffffff
/**************************************************************
; SJIS漢字コ-ドチェックテ-ブル
; bit0 SJIS第1コ-ド
; bit1 SJIS第2コ-ド
;**************************************************************/
.globl _kantbl
/*
; 0 1 2 3 4 5 6 7 8 9 A B C D E F
*/
_kantbl:
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.byte 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
.byte 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
.byte 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
.byte 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0
.byte 2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
.byte 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
.byte 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
.byte 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
.byte 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
.byte 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
.byte 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
.byte 3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0
/**************************************************************
;
; 文字色及び背景色テ-ブルとANK文字イメ-ジの初期化
;
;void ctblset(chrcol,bakcol);
;int chrcol; [ebp+8] 文字色(0-15)
;int bakcol; [ebp+12] 背景色(0-15)
;**************************************************************/
.text
.globl _ctblset
.align 2
_ctblset:
push %ebp
movl %esp,%ebp
push %esi
push %edi
push %fs
movzbl 8(%ebp),%eax
andb $0x0f,%al
movl colptn(,%eax,4),%eax
movl %eax,8(%ebp)
movzbl 12(%ebp),%eax
andb $0x0f,%al
movl colptn(,%eax,4),%eax
movl %eax,12(%ebp)
movl $256,%ecx
movl $fntptn,%esi
movl $fntcol,%edi
ctblp: lodsl
movl %eax,%edx
notl %edx
andl 8(%ebp),%eax
andl 12(%ebp),%edx
orl %edx,%eax
stosl
loop ctblp
movw FONTSEL,%ax
movw %ax,%fs
movl $0x3d800,%esi
movl $ankfnt,%edi
movl $16*256,%ecx
aktb1: movzbl %fs:(%esi),%eax
incl %esi
movl fntcol(,%eax,4),%eax
stosl
loop aktb1
pop %fs
pop %edi
pop %esi
pop %ebp
ret
/**************************************************************
;
; ANK色付文字イメ-ジをVRAMに転送する
;
;【注意】フォント展開時にVRAMの範囲をこえてはならない!
;
;void cwrt_ank(ch,addr)
;char ch; [ebp+8] ANK文字コ-ド(0-256)
;int addr; [ebp+12] VRAMアドレス(0-0x3DFFC)
;**************************************************************/
.globl _cwrt_ank
.align 2
_cwrt_ank:
push %ebp
movl %esp,%ebp
push %es
push %esi
push %edi
movw VRAMSEL,%ax
movw %ax,%es
movzbl 8(%ebp),%esi
shll $6,%esi
addl $ankfnt,%esi
movl 12(%ebp),%edi
movl $512-4,%ecx
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
movsl
addl %ecx,%edi
pop %edi
pop %esi
pop %es
pop %ebp
ret
/**************************************************************
;
; SJIS漢字を色付イメ-ジテ-ブルに展開してVRAMに転送する
;
;【注意】フォント展開時にVRAMの範囲をこえてはならない!
;
;void cwrt_kan(ch,addr)
;short ch; [ebp+8] SJIS漢字コ-ド
;int addr; [ebp+12] VRAMアドレス(0-0x3DFF9)
;**************************************************************/
.globl _cwrt_kan
.align 2
_cwrt_kan:
push %ebp
movl %esp,%ebp
push %fs
push %gs
push %es
push %ds
push %esi
push %edi
push %edx
push %ebx
movw VRAMSEL,%ax
movw %ax,%es
movw TBIOSEL,%ax
movw %ax,%fs
movw %ds,%ax
movw %ax,%gs
movzwl 8(%ebp),%ebx
shlb $1,%bh
cmpb $0x80,%bl
adcw $0x1f61,%bx
addb $0x7f,%bl
jc wt_kn1
addb $0xa2,%bl
wt_kn1: andb $0x7f,%bh
movw $0x100,%ax
movw $0x1010,%dx
lcall %fs:0xa0
movl %ss:12(%ebp),%edi
movl $fntcol,%ebx
xorl %edx,%edx
xorl %ecx,%ecx
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
lodsw
movb %al,%cl
movb %ah,%dl
movl %gs:(%ebx,%ecx,4),%eax
stosl
movl %gs:(%ebx,%edx,4),%eax
stosl
addl $512-4*2,%edi
pop %ebx
pop %edx
pop %edi
pop %esi
pop %ds
pop %es
pop %gs
pop %fs
pop %ebp
ret
/**************************************************************
;
; 上方向に4角枠内を縦16ドットソフトスクロ-ルさせる
;
;【注意】sizeは8ドット単位で転送されるので充分に注意!
;
;void vram_scrool(addr,size,line,bakcol)
;char *addr; [ebp+8] 先頭VRAMアドレス
;int size; [ebp+12] 横のドット数
;int line; [ebp+16] 縦のドット数
;int bakcol; [ebp+20] クリア範囲の文字色
;
;int page; [ebp-4] VRAMペ-ジのワ-ク
;**************************************************************/
.globl _vram_scrool
.align 2
_vram_scrool:
push %ebp
movl %esp,%ebp
movl 8(%ebp),%eax
andl $0x40000,%eax
push %eax
push %edi
push %esi
push %edx
push %ecx
push %ebx
push %es
push %ds
push %fs
push %ds
pop %fs
movzbl 20(%ebp),%eax
movl colptn(,%eax,4),%eax
movl %eax,20(%ebp)
movw VRAMSEL,%ax
movw %ax,%es
movw %ax,%ds
movl 8(%ebp),%edi
movl %edi,%esi
addl $512*16,%esi
andl $0x3ffff,%esi
orl -4(%ebp),%esi
movl $1024,%ebx
subl 12(%ebp),%ebx
shrl $1,%ebx
movl 12(%ebp),%eax
shrl $3,%eax
movl %eax,12(%ebp)
movl 16(%ebp),%edx
vr_lp: movl 12(%ebp),%ecx
rep
movsl
addl %ebx,%esi
andl $0x3ffff,%esi
orl -4(%ebp),%esi
addl %ebx,%edi
andl $0x3ffff,%edi
orl -4(%ebp),%edi
decl %edx
jne vr_lp
movl 20(%ebp),%eax
movl $16,%edx
vr_cr: movl 12(%ebp),%ecx
rep
stosl
addl %ebx,%edi
andl $0x3ffff,%edi
orl -4(%ebp),%edi
decl %edx
jne vr_cr
pop %fs
pop %ds
pop %es
pop %ebx
pop %ecx
pop %edx
pop %esi
pop %edi
pop %eax
pop %ebp
ret
/**************************************************************
;
; 下方向に4角枠内を縦16ドットソフトスクロ-ルさせる
;
;【注意】sizeは8ドット単位で転送されるので充分に注意!
;
;void vram_bk_scr(addr,size,line,bakcol)
;char *addr; [ebp+8] 先頭VRAMアドレス
;int size; [ebp+12] 横のドット数
;int line; [ebp+16] 縦のドット数
;int bakcol; [ebp+20] クリア範囲の文字色
;
;int page; [ebp-4] VRAMペ-ジのワ-ク
;**************************************************************/
.globl _vram_bk_scr
_vram_bk_scr:
push %ebp
movl %esp,%ebp
movl 8(%ebp),%eax
andl $0x40000,%eax
push %eax
push %edi
push %esi
push %edx
push %ecx
push %ebx
push %es
push %ds
push %fs
push %ds
pop %fs
movzbl 20(%ebp),%eax
movl colptn(,%eax,4),%eax
movl %eax,20(%ebp)
movw VRAMSEL,%ax
movw %ax,%es
movw %ax,%ds
movl 8(%ebp),%esi
movl %edi,%edi
addl $512*16,%edi
andl $0x3ffff,%edi
orl -4(%ebp),%edi
movl $1024,%ebx
addl 12(%ebp),%ebx
shrl $1,%ebx
movl 12(%ebp),%eax
shrl $3,%eax
movl %eax,12(%ebp)
movl 16(%ebp),%edx
br_lp: movl 12(%ebp),%ecx
rep
movsl
subl %ebx,%esi
andl $0x3ffff,%esi
orl -4(%ebp),%esi
subl %ebx,%edi
andl $0x3ffff,%edi
orl -4(%ebp),%edi
decl %edx
jne br_lp
movl 20(%ebp),%eax
movl $16,%edx
br_cr: movl 12(%ebp),%ecx
rep
stosl
subl %ebx,%edi
andl $0x3ffff,%edi
orl -4(%ebp),%edi
decl %edx
jne br_cr
pop %fs
pop %ds
pop %es
pop %ebx
pop %ecx
pop %edx
pop %esi
pop %edi
pop %eax
pop %ebp
ret
/**************************************************************
;
; 4角枠内を指定色でクリアする
;
;【注意】sizeは8ドット単位でクリアされるので充分に注意!
;
;void vram_cls(addr,size,line,bakcol)
;char *addr; [ebp+8] 先頭VRAMアドレス
;int size; [ebp+12] 横のドット数
;int line; [ebp+16] 縦のドット数
;int bakcol; [ebp+20] 背景色
;
;int page; [ebp-4] VRAMペ-ジのワ-ク
;**************************************************************/
.globl _vram_cls
_vram_cls:
push %ebp
movl %esp,%ebp
movl 8(%ebp),%eax
andl $0x40000,%eax
push %eax
push %edi
push %edx
push %ecx
push %ebx
push %es
movzbl 20(%ebp),%eax
movl colptn(,%eax,4),%eax
movl %eax,20(%ebp)
movw VRAMSEL,%ax
movw %ax,%es
movl 8(%ebp),%edi
movl $1024,%ebx
subl 12(%ebp),%ebx
shrl $1,%ebx
movl 12(%ebp),%eax
shrl $3,%eax
movl %eax,12(%ebp)
movl 20(%ebp),%eax
movl 16(%ebp),%edx
vr_clp: movl 12(%ebp),%ecx
rep
stosl
addl %ebx,%edi
andl $0x3ffff,%edi
orl -4(%ebp),%edi
decl %edx
jne vr_clp
pop %es
pop %ebx
pop %ecx
pop %edx
pop %edi
pop %eax
pop %ebp
ret
/**************************************************************
;
; 任意のCRTCレジスタに任意のワ-ド値を設定する
;
;void vram_offset(reg,ofs)
;int reg; [ebp+8] CRTCレジスタNo.
;int ofs; [ebp+12] 設定値
;**************************************************************/
.globl _vram_offset
_vram_offset:
push %ebp
movl %esp,%ebp
push %edx
movb 8(%ebp),%al
movw $0x440,%dx
outb %al,%dx
movl 12(%ebp),%eax
movw $0x442,%dx
outw %ax,%dx
pop %edx
pop %ebp
ret
/**************************************************************
;
; ANK文字をイメ-ジ展開してVRAMに転送する
;
;【注意】フォント展開時にVRAMの範囲をこえてはならない!
;
;void wrt_ank(ch,addr,chrcol,bakcol)
;char ch; [ebp+8] ANK文字コ-ド(0-256)
;int addr; [ebp+12] VRAMアドレス(0-0x3DFFC)
;int chrcol; [ebp+16] 文字色
;int bakcol; [ebp+20] 背景色
;**************************************************************/
.globl _wrt_ank
_wrt_ank:
push %ebp
movl %esp,%ebp
push %fs
push %es
push %esi
push %edi
push %edx
push %ebx
movzbl 16(%ebp),%eax
movl colptn(,%eax,4),%eax
movl %eax,16(%ebp)
movzbl 20(%ebp),%eax
movl colptn(,%eax,4),%eax
movl %eax,20(%ebp)
movw VRAMSEL,%ax
movw %ax,%es
movw FONTSEL,%ax
movw %ax,%fs
movzbl 8(%ebp),%esi
shll $4,%esi
addl $0x3d800,%esi
movl 12(%ebp),%edi
movl $16,%ecx
cwtak1: movzbl %fs:(%esi),%eax
incl %esi
movl fntptn(,%eax,4),%eax
movl %eax,%edx
notl %edx
andl 16(%ebp),%eax
andl 20(%ebp),%edx
orl %edx,%eax
movl %eax,%es:(%edi)
addl $512,%edi
loop cwtak1
pop %ebx
pop %edx
pop %edi
pop %esi
pop %es
pop %fs
pop %ebp
ret
/**************************************************************
;
; SJIS漢字をイメ-ジ展開してVRAMに転送する
;
;【注意】フォント展開時にVRAMの範囲をこえてはならない!
;
;void wrt_kan(ch,addr,chrcol,bakcol)
;short ch; [ebp+8] SJIS漢字コ-ド
;int addr; [ebp+12] VRAMアドレス(0-0x3DFF9)
;int chrcol; [ebp+16] 文字色
;int bakcol; [ebp+20] 背景色
;**************************************************************/
.globl _wrt_kan
_wrt_kan:
push %ebp
mov %esp,%ebp
push %fs
push %gs
push %es
push %ds
push %esi
push %edi
push %edx
push %ebx
movzbl 16(%ebp),%eax
movl colptn(,%eax,4),%eax
movl %eax,16(%ebp)
movzbl 20(%ebp),%eax
movl colptn(,%eax,4),%eax
movl %eax,20(%ebp)
movw VRAMSEL,%ax
movw %ax,%es
movw FONTSEL,%ax
movw %ax,%fs
movzwl 8(%ebp),%ebx
shlb $1,%bh
cmpb $0x80,%bl
adcw $0x1f61,%bx
addb $0x7f,%bl
jc cwtkn1
addb $0xa2,%bl
cwtkn1: andb $0x7f,%bh
movw $0x100,%ax
movw $0x1010,%dx
push %ds
lcall %fs:0xa0
push %ds
pop %gs
pop %ds
movl 12(%ebp),%edi
movl $16,%ecx
cwtkn2: movzbl %gs:(%esi),%eax
incl %esi
movl fntptn(,%eax,4),%eax
movl %eax,%edx
notl %edx
andl 16(%ebp),%eax
andl 20(%ebp),%edx
orl %edx,%eax
movl %eax,%es:(%edi)
movzbl %gs:(%esi),%eax
incl %esi
movl fntptn(,%eax,4),%eax
movl %eax,%edx
notl %edx
andl 16(%ebp),%eax
andl 20(%ebp),%edx
orl %edx,%eax
movl %eax,%es:4(%edi)
addl $512,%edi
loop cwtkn2
pop %ebx
pop %edx
pop %edi
pop %esi
pop %ds
pop %es
pop %gs
pop %fs
pop %ebp
ret
/**************************************************************
;
; 安易なカ-ソルを表示させる
;
;【注意】VRAMの範囲をこえてはならない!
;
;void wrt_cur(addr,line)
;int addr; [esp+4] VRAMアドレス(0-0x3DFFC)
;int line; [esp+8] 縦ライン数
;**************************************************************/
.globl _wrt_cur
_wrt_cur:
movl 4(%esp),%eax
movl 8(%esp),%ecx
orl %ecx,%ecx
je wtcule /* カーソルサイズが0の時はカーソルを表示しない */
push %fs
push %bx
movw VRAMSEL,%bx
movw %bx,%fs
wtculp: notl %fs:(%eax)
addl $512,%eax
loop wtculp
pop %bx
pop %fs
wtcule: ret
/* DIVIDE_END */
/* DIVIDE_START=egb_b2.s */
/*
T-BIOS Graphics Library
for GNU assembler
by Waku Factory
90/03/20 Ver 1.0
90/10/11 1.2
*/
.globl _EGB_getBlockColor
.globl _EGB_putBlockColor
.globl _EGB_getBlock
.globl _EGB_putBlock
.globl _EGB_getBlockZoom
.globl _EGB_putBlockZoom
.data
.text
/****************************************
EGB block operation 2 / 3
****************************************/
/*
EGB_getBlockColor( char *gwork, char *param ) 矩形領域読みだし(色指定)
*/
.align 4
_EGB_getBlockColor:
push %edi
push %esi
movl 16(%esp),%esi
movb $0x22,%ah
movl 12(%esp),%edi
push $0x0110
pop %fs
lcall %fs:(0x20)
movsbl %ah,%eax
pop %esi
pop %edi
ret
/*
EGB_putBlockColor( char *gwork,int clip, char *param ) 矩形領域書き込み(色指定)
*/
.align 4
_EGB_putBlockColor:
push %edi
push %esi
movw 16(%esp),%al
movl 20(%esp),%esi
movb $0x23,%ah
movl 12(%esp),%edi
push $0x0110
pop %fs
lcall %fs:(0x20)
movsbl %ah,%eax
pop %esi
pop %edi
ret
/*
EGB_getBlock( char *gwork,char *param ) 矩形領域読みだし(フルカラー)
*/
.align 4
_EGB_getBlock:
push %edi
push %esi
movl 16(%esp),%esi
movb $0x24,%ah
movl 12(%esp),%edi
push $0x0110
pop %fs
lcall %fs:(0x20)
movsbl %ah,%eax
pop %esi
pop %edi
ret
/*
EGB_putBlock( char *gwork, int clip, char *param ) 矩形領域書き込み(フルカラー)
*/
.align 4
_EGB_putBlock:
push %edi
push %esi
movb 16(%esp),%al
movl 20(%esp),%esi
movb $0x25,%ah
movl 12(%esp),%edi
push $0x0110
pop %fs
lcall %fs:(0x20)
movsbl %ah,%eax
pop %esi
pop %edi
ret
/*
EGB_getBlockZoom( char *gwork, char *param ) 矩形領域読みだし(ズーム付)
*/
.align 4
_EGB_getBlockZoom:
push %edi
push %esi
movl 16(%esp),%esi
movb $0x26,%ah
movl 12(%esp),%edi
push $0x0110
pop %fs
lcall %fs:(0x20)
movsbl %ah,%eax
pop %esi
pop %edi
ret
/*
EGB_putBlockZoom( char *gwork,int clip, char *param ) 矩形領域書き込み(ズーム付)
*/
.align 4
_EGB_putBlockZoom:
push %edi
push %esi
movb 16(%esp),%al
movl 20(%esp),%esi
movb $0x27,%ah
movl 12(%esp),%edi
push $0x0110
pop %fs
lcall %fs:(0x20)
movsbl %ah,%eax
pop %esi
pop %edi
ret
/* DIVIDE_END */
/* DIVIDE_START=vram.s */
/***************************************************************
;
; 16色VRAM文字表示下位ル-チン
;
; 1991.01.01 Make by 山先
;
;***************************************************************/
/**************************************************************
; セレクタ値の定義
;**************************************************************/
#define VRAMSEL $0x104
/**************************************************************
;
; 4角枠内のデータをロードする
;
; VRAM → data
;
;【注意】sizeは8ドット単位でロードされるので充分に注意!
;
;void _vram_load(addr,size,line,data)
;int addr; [ebp+8] 先頭VRAMアドレス
;int size; [ebp+12] 横のドット数
;int line; [ebp+16] 縦のドット数
;char *data; [ebp+20] ロードするアドレス
;
;int page; [ebp-4] VRAMペ-ジのワ-ク
;**************************************************************/
.globl __vram_load
__vram_load:
push %ebp
movl %esp,%ebp
movl 8(%ebp),%eax /* 先頭VRAMアドレス */
andl $0x40000,%eax
push %eax /* page */
push %edi
push %esi
push %edx
push %ecx
push %ebx
push %es
push %ds
push %fs
push %ds
pop %fs
movw VRAMSEL,%ax
movw %ax,%ds /* DS:ESI → ES:EDI */
movl 20(%ebp),%edi /* 保存するアドレス */
movl 8(%ebp),%esi /* 先頭VRAMアドレス */
andl $0x3ffff,%esi
orl -4(%ebp),%esi /* page */
movl $1024,%ebx
subl 12(%ebp),%ebx /* 横のドット数 */
shrl $1,%ebx /* 丸める */
movl 12(%ebp),%eax /* 横のドット数 */
shrl $3,%eax /* 8ドットに丸める */
movl %eax,12(%ebp) /* 横のドット数 */
movl 16(%ebp),%edx /* 縦のドット数 */
vr_lad: movl 12(%ebp),%ecx /* 繰り返しの数 */
rep
movsl
addl %ebx,%esi /* 転送元(VRAM) */
andl $0x3ffff,%esi
orl -4(%ebp),%esi
decl %edx
jne vr_lad
pop %fs
pop %ds
pop %es
pop %ebx
pop %ecx
pop %edx
pop %esi
pop %edi
pop %eax
pop %ebp
ret
/**************************************************************
;
; 4角枠内のデータをセーブする
;
; data → VRAM
;
;【注意】sizeは8ドット単位でセーブされるので充分に注意!
;
;void _vram_save(addr,size,line,data)
;int addr; [ebp+8] 先頭VRAMアドレス
;int size; [ebp+12] 横のドット数
;int line; [ebp+16] 縦のドット数
;char *data; [ebp+20] ロードするアドレス
;
;int page; [ebp-4] VRAMペ-ジのワ-ク
;**************************************************************/
.globl __vram_save
__vram_save:
push %ebp
movl %esp,%ebp
movl 8(%ebp),%eax /* 先頭VRAMアドレス */
andl $0x40000,%eax
push %eax /* page */
push %edi
push %esi
push %edx
push %ecx
push %ebx
push %es
push %ds
push %fs
push %ds
pop %fs
movw VRAMSEL,%ax
movw %ax,%es /* DS:ESI → ES:EDI */
movl 20(%ebp),%esi /* セーブするデータのアドレス */
movl 8(%ebp),%edi /* 先頭VRAMアドレス */
andl $0x3ffff,%edi
orl -4(%ebp),%edi /* page */
movl $1024,%ebx
subl 12(%ebp),%ebx /* 横のドット数 */
shrl $1,%ebx /* 丸める */
movl 12(%ebp),%eax /* 横のドット数 */
/* 8ドット単位で転送するので */
shrl $3,%eax /* 8ドットに丸める */
movl %eax,12(%ebp) /* 横のドット数 */
movl 16(%ebp),%edx /* 縦のドット数 */
vr_sav: movl 12(%ebp),%ecx /* 繰り返しの数 */
rep
movsl
addl %ebx,%edi /* 転送先(VRAM) */
andl $0x3ffff,%edi
orl -4(%ebp),%edi
decl %edx
jne vr_sav
pop %fs
pop %ds
pop %es
pop %ebx
pop %ecx
pop %edx
pop %esi
pop %edi
pop %eax
pop %ebp
ret
/* DIVIDE_END */